package org.projetjava.metier.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


import org.projetjava.metier.model.Parcours;
import org.projetjava.metier.model.Poi;

public class ParcoursDao extends Bdd {

	private Connection con;
	
	private PreparedStatement prepStatRechNomExact = null;
	private PreparedStatement prepStatRechPartieNom = null;
	private PreparedStatement prepStatRechNomDescription = null;
	private PreparedStatement prepStatParcours = null;
	private PreparedStatement prepStatImageParcours = null;
	private PreparedStatement prepStatAjoutParcours = null;
	private PreparedStatement prepStatIdDerniereParcours = null;
	private PreparedStatement prepStatAjoutImageParcours = null;
	private PreparedStatement prepStatAjoutParcoursContient = null;
	private PreparedStatement prepStatModifierParcours = null;
	private PreparedStatement prepStatSupprImages = null;
	private PreparedStatement prepStatSupprParcours = null;
	private PreparedStatement prepStatSupprHyperText = null;
	private PreparedStatement prepStatSupprParcoursContient = null;
	private PreparedStatement prepStatListParcours = null;
	
	
	public ParcoursDao()
	{
		super();
		this.con = this.getConnection();
	}
	
	public int ajouter(Parcours parcours)
	{
		try {
			
			if(this.prepStatAjoutParcours == null)
			{
				this.prepStatAjoutParcours = this.con.prepareStatement("INSERT INTO Parcours(Libelle_Parcours, Texte_Description_Parcours) VALUES (?,?)");
			}
			this.prepStatAjoutParcours.setString(1, parcours.getLibelle());
			this.prepStatAjoutParcours.setString(2, parcours.getDescription());
			//execution
			this.prepStatAjoutParcours.executeUpdate();
			
			if(this.prepStatIdDerniereParcours == null)
			{
				this.prepStatIdDerniereParcours = this.con.prepareStatement("SELECT Max(ID_Parcours) FROM Parcours");
			}
			//execution
			ResultSet resultId = this.prepStatIdDerniereParcours.executeQuery();
			int idParcours = 0;
			//boucle sur result
			while(resultId.next()){   
				//1 er résultat
				if(resultId.first())
				{
					idParcours = (int) resultId.getObject(1);
				}
			}
			
			
			//list hypertext
			HyperTextDao daoHypertext = new HyperTextDao();
			daoHypertext.AjoutHyperTextParcours(parcours,idParcours);
			
			
			//Ajout IMAGES
			if(this.prepStatAjoutImageParcours == null)
			{
				this.prepStatAjoutImageParcours = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_Parcours) VALUES (?,?)");
			}
			
			for(String list : parcours.getLienImages())
			{
				this.prepStatAjoutImageParcours.setString(1, list);
				this.prepStatAjoutImageParcours.setInt(2, idParcours);
				this.prepStatAjoutImageParcours.executeUpdate();
			}
			
			//parcours contient
			if(this.prepStatAjoutParcoursContient == null)
			{
				this.prepStatAjoutParcoursContient = this.con.prepareStatement("INSERT INTO ParcoursContient(ID_POI, ID_Parcours) VALUES (?,?)");
			}
			
			for(Poi poi: parcours.getListPoi())
			{
				this.prepStatAjoutParcoursContient.setInt(1, poi.getId());
				this.prepStatAjoutParcoursContient.setInt(2, idParcours);
				this.prepStatAjoutParcoursContient.executeUpdate();
			}
			
		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	public int modifier(Parcours parcours)
	{
		try {
			if(this.prepStatModifierParcours == null)
			{
				this.prepStatModifierParcours = this.con.prepareStatement("UPDATE Parcours SET Libelle_Parcours=?,Texte_Description_Parcours=? WHERE ID_Parcours=?");
			}
			this.prepStatModifierParcours.setString(1, parcours.getLibelle().toString());
			this.prepStatModifierParcours.setString(2, parcours.getDescription().toString());
			this.prepStatModifierParcours.setInt(3, parcours.getId());
			this.prepStatModifierParcours.executeUpdate();
			
			//delete img
			if(this.prepStatSupprImages == null)
			{
				this.prepStatSupprImages= this.con.prepareStatement("DELETE FROM Images WHERE ID_Parcours = ?");
			}
			this.prepStatSupprImages.setInt(1, parcours.getId());
			this.prepStatSupprImages.executeUpdate();
			
			//delete hypertext
			if(this.prepStatSupprHyperText == null)
			{
				this.prepStatSupprHyperText= this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Parcours = ?");
			}
			this.prepStatSupprHyperText.setInt(1, parcours.getId());
			this.prepStatSupprHyperText.executeUpdate();
			
			//supprimer parcours contient
			if(this.prepStatSupprParcoursContient == null)
			{
				this.prepStatSupprParcoursContient= this.con.prepareStatement("DELETE FROM ParcoursContient WHERE ID_Parcours = ?");
			}
			this.prepStatSupprParcoursContient.setInt(1, parcours.getId());
			this.prepStatSupprParcoursContient.executeUpdate();
			
			
			//list hypertext
			HyperTextDao daoHypertext = new HyperTextDao();
			daoHypertext.AjoutHyperTextParcours(parcours,parcours.getId());
			
			
			//Ajout IMAGES
			if(this.prepStatAjoutImageParcours == null)
			{
				this.prepStatAjoutImageParcours = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_Parcours) VALUES (?,?)");
			}
			
			for(String list : parcours.getLienImages())
			{
				this.prepStatAjoutImageParcours.setString(1, list);
				this.prepStatAjoutImageParcours.setInt(2, parcours.getId());
				this.prepStatAjoutImageParcours.executeUpdate();
			}
			
			//parcours contient
			if(this.prepStatAjoutParcoursContient == null)
			{
				this.prepStatAjoutParcoursContient = this.con.prepareStatement("INSERT INTO ParcoursContient(ID_POI, ID_Parcours) VALUES (?,?)");
			}
			
			for(Poi poi: parcours.getListPoi())
			{
				this.prepStatAjoutParcoursContient.setInt(1, poi.getId());
				this.prepStatAjoutParcoursContient.setInt(2, parcours.getId());
				this.prepStatAjoutParcoursContient.executeUpdate();
			}

		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	
	public int supprimer(Parcours parcours)
	{
		try {
			//delete img
			if(this.prepStatSupprImages == null)
			{
				this.prepStatSupprImages= this.con.prepareStatement("DELETE FROM Images WHERE ID_Parcours = ?");
			}
			this.prepStatSupprImages.setInt(1, parcours.getId());
			this.prepStatSupprImages.executeUpdate();
			
			//delete hypertext
			if(this.prepStatSupprHyperText == null)
			{
				this.prepStatSupprHyperText= this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Parcours = ?");
			}
			this.prepStatSupprHyperText.setInt(1, parcours.getId());
			this.prepStatSupprHyperText.executeUpdate();
			
			//supprimer parcours contient
			if(this.prepStatSupprParcoursContient == null)
			{
				this.prepStatSupprParcoursContient= this.con.prepareStatement("DELETE FROM ParcoursContient WHERE ID_Parcours = ?");
			}
			this.prepStatSupprParcoursContient.setInt(1, parcours.getId());
			this.prepStatSupprParcoursContient.executeUpdate();
			
			
			//suppr parcours
			if(this.prepStatSupprParcours == null)
			{
				this.prepStatSupprParcours = this.con.prepareStatement("DELETE FROM Parcours WHERE ID_Parcours = ?");
			}
			this.prepStatSupprParcours.setInt(1, parcours.getId());
			this.prepStatSupprParcours.executeUpdate();
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	
	public List<String> rechercheParNomExact(String recherche)
	{
		List<String> listResultat = new ArrayList<>();
		try {
		
			if(this.prepStatRechNomExact == null)
			{
				this.prepStatRechNomExact = this.con.prepareStatement("SELECT Libelle_Parcours FROM Parcours WHERE Libelle_Parcours = ?");
			}
			
			this.prepStatRechNomExact.setString(1, recherche);
		     
		    //L'objet ResultSet contient le r�sultat de la requ�te SQL
		    ResultSet result = this.prepStatRechNomExact.executeQuery();
		      
		      
		     
		    while(result.next()){         
		    	listResultat.add(result.getObject(1).toString());
		    }

		    result.close();
	         
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	  return listResultat;	
	}
	
	public List<String> rechercheParNom(String recherche)
	{
		String like = "%" + recherche + "%";  
		List<String> listResultat = new ArrayList<>();
		
		try {
		
			if(this.prepStatRechPartieNom == null)
			{
				this.prepStatRechPartieNom = this.con.prepareStatement("SELECT Libelle_Parcours FROM Parcours WHERE Libelle_Parcours LIKE ?");
			}
			
			this.prepStatRechPartieNom.setString(1, like);
		     
		    //L'objet ResultSet contient le r�sultat de la requ�te SQL
		    ResultSet result = this.prepStatRechPartieNom.executeQuery();

		    while(result.next()){         
		    	listResultat.add(result.getObject(1).toString());
		    }

		    result.close();
	         
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	  return listResultat;
		
	}
	
	public List<String> rechercheParLibelleDescription(String recherche)
	{
		String like = "%" + recherche + "%"; 
		List<String> listResultat = new ArrayList<>();
		
		try {
		
			if(this.prepStatRechNomDescription == null)
			{
				this.prepStatRechNomDescription = this.con.prepareStatement("SELECT Libelle_Parcours FROM Parcours WHERE Libelle_Parcours LIKE ? OR Texte_Description_Parcours LIKE ?");
			}
			
			this.prepStatRechNomDescription.setString(1, like);
			this.prepStatRechNomDescription.setString(2, like);
		     
		    //L'objet ResultSet contient le r�sultat de la requ�te SQL
		    ResultSet result = this.prepStatRechNomDescription.executeQuery();

		    while(result.next()){         
		    	listResultat.add(result.getObject(1).toString());
		    }

		    result.close();
	         
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	  return listResultat;
		
	}
	
	public Parcours selectionParcours(String libelle)
	{
		Parcours parcours = null;
		try {
			//Les POI contenue dans l'objet parcours doivent posseder un String lieu contenant le lieux du POI
			if(this.prepStatParcours == null)
			{
				this.prepStatParcours = this.con.prepareStatement("SELECT ID_Parcours, Libelle_Parcours, Texte_Description_Parcours FROM Parcours WHERE Libelle_Parcours = ?");
			}
			this.prepStatParcours.setString(1, libelle);
			ResultSet resultParcours = this.prepStatParcours.executeQuery();
			
			while(resultParcours.next()){
				parcours = new Parcours();
				
				parcours.setLibelle(resultParcours.getObject(2).toString());
				parcours.setDescription(resultParcours.getObject(3).toString());
				parcours.setId((int) resultParcours.getObject(1));
				
				List<Poi> listPoi = new ArrayList<>();
				PoiDao poi = new PoiDao();
				listPoi = poi.SelectPoiParcours((int) resultParcours.getObject(1));
				
				parcours.setListPoi(listPoi);
				
				
				LieuDao daolieu = new LieuDao();
				parcours.setListLieu(daolieu.ObtenirListLieuxParcours((int) resultParcours.getObject(1)));
				
				
				
				//hypertext
				HyperTextDao daoHypertext = new HyperTextDao();
				parcours.setLienHyperText(daoHypertext.SelectHyperTextParcours((int) resultParcours.getObject(1)));
				
				//images
				List<String> listImage = new ArrayList<>();
				
				
				//requete préparé des liens des images
				if(this.prepStatImageParcours == null)
				{
					this.prepStatImageParcours = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_Parcours =?");
				}
				
				//argument
				this.prepStatImageParcours.setInt(1, (int) resultParcours.getObject(1));
				
				//on stock dans le resultLienImage
				ResultSet resultLienImage = this.prepStatImageParcours.executeQuery();
				while(resultLienImage.next()){
					listImage.add(resultLienImage.getObject(1).toString());
				}
				//on ajoute à l'aide du setteur
				parcours.setLienImages(listImage);
				
				
			}
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		

		return parcours;
	}
	
	public List<String> ListParcours(){
		List<String> listParcours = new ArrayList<>();
		
		try {
			if(this.prepStatListParcours == null)
			{
				this.prepStatListParcours = this.con.prepareStatement("SELECT Libelle_Parcours FROM Parcours");
			}
			ResultSet resultParcours = this.prepStatListParcours.executeQuery();
			while(resultParcours.next()){
				listParcours.add(resultParcours.getObject(1).toString());
			}
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return listParcours;
	}
}
